/*-------------------------------------------------------------------------
 *
 * pg_opclass.h
 *	  "操作符类"系统目录的定义 (pg_opclass)
 *
 * 此表的主键是 <opcmethod, opcname, opcnamespace> ---
 * 也就是说，每个有效的操作符类名称和
 * 索引访问方法类型的组合都有一行。该行指定了操作符类的预期输入数据类型
 * （堆列的类型，或在索引表达式情况下的表达式输出类型）。注意，对于指定类型的二进制可转换类型也将被接受。
 *
 * 对于给定的 <opcmethod, opcintype> 对，可以最多有一行
 * 的 opcdefault = true；该行是此类数据在
 * 此类索引中的默认操作符类。 （目前未通过索引实施此限制，因为我们
 * 不支持系统目录上的部分索引。）
 *
 * 通常 opckeytype = InvalidOid（零），表示存储在
 * 索引中的数据与索引列中的数据相同。如果 opckeytype
 * 非零，则表示需要进行转换步骤以生成
 * 存储的索引数据，该数据将是 opckeytype 类型（可能与
 * 输入数据类型相同或不同）。进行此类
 * 转换的责任在于索引访问方法 --- 并非所有
 * AMs 都支持此功能。
 *
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/catalog/pg_opclass.h
 *
 * NOTES
 *	  Catalog.pm模块读取此文件并推导模式
 *	  信息。
 *
 *-------------------------------------------------------------------------
 */
#ifndef PG_OPCLASS_H
#define PG_OPCLASS_H

#include "catalog/genbki.h"
#include "catalog/pg_opclass_d.h"

/* ----------------
 *		pg_opclass定义。cpp将其转换为
 *		typedef struct FormData_pg_opclass
 * ----------------
 */
CATALOG(pg_opclass,2616,OperatorClassRelationId)
{
	Oid			oid;			/* oid */

	/* 索引访问方法opclass所针对的 */
	Oid			opcmethod BKI_LOOKUP(pg_am);

	/* 此opclass的名称 */
	NameData	opcname;

	/* 此opclass的命名空间 */
	Oid			opcnamespace BKI_DEFAULT(pg_catalog) BKI_LOOKUP(pg_namespace);

	/* opclass所有者 */
	Oid			opcowner BKI_DEFAULT(POSTGRES) BKI_LOOKUP(pg_authid);

	/* 包含的操作符族 */
	Oid			opcfamily BKI_LOOKUP(pg_opfamily);

	/* 数据的类型由操作类索引 */
	Oid			opcintype BKI_LOOKUP(pg_type);

	/* 如果操作类是 opcintype 的默认值，则为 T */
	bool		opcdefault BKI_DEFAULT(t);

	/* 索引中的数据类型，如果与输入列类型相同则为 InvalidOid */
	Oid			opckeytype BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_type);
} FormData_pg_opclass;

/* ----------------
 *		Form_pg_opclass 对应于指向具有
 *		pg_opclass 关系格式的元组的指针。
 * ----------------
 */
typedef FormData_pg_opclass *Form_pg_opclass;

DECLARE_UNIQUE_INDEX(pg_opclass_am_name_nsp_index, 2686, OpclassAmNameNspIndexId, on pg_opclass using btree(opcmethod oid_ops, opcname name_ops, opcnamespace oid_ops));
DECLARE_UNIQUE_INDEX_PKEY(pg_opclass_oid_index, 2687, OpclassOidIndexId, on pg_opclass using btree(oid oid_ops));

#endif							/* PG_OPCLASS_H */
